package com.atguigu.bigdata.scala.chapter05

object Scala09_Function {

    def main(args: Array[String]): Unit = {

        // TODO 函数式编程 - 闭包
        // 读源码：
        def outer( x : Int ) = {
            def inner( y : Int )  = {
                x + y
            }

            inner _
        }

        //println(outer(10)(20))
        // scala中函数是什么？java中没有函数的概念，编译的字节码中没有
        // scala中函数在编译为字节码时其实编译成了方法

        // 在嵌套函数调用时，函数访问了外部的变量（参数），将外部的参数包含到函数的内容
        // 形成一个闭合的环境，改变变量的生命周期，这个环境称之为闭包环境，简称闭包

        // 所谓的闭包其实就是闭合和包含
        // 这里的包含指的是将函数使用的外部的变量包含到函数的内部
        // 这里的闭合指的是包含到函数内部的变量不能让别人用，可以改变使用变量的生命周期
        // 1. 所有的嵌套函数的使用都有闭包
        // 2. 所有的匿名函数都有闭包。

        val f = outer(10)
        println(f(20))

        val a = 10

        def test1(): Unit = {
            a + 20
        }
        test1()
    }

}
